home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Inside!
/
Amiga FD Inside (1995)(Ultramax).iso
/
forumamiga
/
ausgabe09
/
texte
/
gadgets
< prev
next >
Wrap
Text File
|
1992-09-05
|
5KB
|
153 lines
[0m[0 p André Voget 31.08.92
[0;3mBool-Gadgets in Gfa-Programmen mit dem OS2-Look[0m
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Im folgenden stelle ich Dir zwei Unterroutinen für Deine Gfa-Basic-Un
terroutinen-Sammlung vor:
a) "intgadget" erzeugt in einem Window ein Bool-Gadget. Das Gadget kann
auf drei verschiedene Arten angezeigt werden: OS2-Look, OS2-Look einge
drückt und beide kombiniert. Am besten probierst Du alle drei Möglich
keiten einmal aus. Selbstverständlich kann ein Text im Gadget ausgegeben
werden, das automatisch einen Schatten bekommt. Damit die Gadgets ihren
OS2-Look entfalten können, müssen auch die OS2-Farben eingestellt sein
(Farbe 0: &H777, Farbe 1: &H000, Farbe 2: &HFFF, Farbe 3: &H68B ).
b) "killintgadget" löscht ein Gadget aus dem Window und gibt den benö
tigten Speicher wieder frei.
Um die Routine "intgadget" nutzen zu können, mußt Du ein Window mit der
Routine "owindow" ( in einem anderen Artikel in dieser Forum-Ausgabe )
geöffnet haben. Außerdem mußt Du am Programmende das Feld "bgadget" di
mensionieren, und zwar so:
DIM bgadget%(10)
Statt der "10" kannst Du auch andere Werte eintragen, je nachdem wievie
le Gadgets Du erzeugen möchtest.
Die Routine "intgadget" benötigt neun Parameter:
win& = ist die Nummer des mit "owindow" geöffneten Windows
nr& = ist die Indexzahl. Für jedes neue Gadget mußt Du eine andere
Nummer eintragen. Erlaubt sind Zahlen, die Du bei der Dimension-
ierung angegeben hast. Wenn Du "0" angibst, dann wird zwar die
OS2-Box mit String ausgegeben, aber es wird kein Gadget erstellt.
x1&,y1&,x2&,y2& : sind die Koordinaten des Gadgets
col& = ist die Farbe, mit der die Box ausgefüllt wird, normalerweise
auf "0" setzen
art& = kann von "1" bis "3" liegen und gibt die Box-Art an ( s.o. )
a$ = ist ein String, der zentriert in der Box mit Schatten ausgegeben
wird. Er sollte in das Gadget passen!
Die Routine "killintgadget" erwartet nur zwei Parameter:
win& = ist wieder einmal die Windownummer eines mit "owindow" geöfffne
ten Windows
i& = ist die Indexzahl ( wie "nr&" bei "intgadget" )
[0;4mUnd hier sind sie endlich:[0m
PROCEDURE intgadget(win&,nr&,x1&,y1&,x2&,y2&,col&,art&,a$)
'
' win& = Windownummer
' nr& = Gadget-ID (0 = kein richtiges Gadget)
' x1 ,y1 = linke, obere Ecke
' x2 ,y2 = rechte, untere Ecke
' col = Farbe zum Ausfüllen der Box
' art = 1: 3D-Darstellung, 2: inverse Darstellung, 4: keine Box
' flags = 1: nur aktiviert, wenn Maus losgelassen, 2: wenn gedrückt
' a$ = Text im Gadget
'
' Vorher definieren: DIM bgadget%(gadgetanzahl&)
'
LOCAL l&,rp%
rp%={win%(win&)+50}
'
' Wenn Du das Window lieber mit "OPENW" öffnen möchtest, dann
' mußt Du statt der vorangegangenen Zeile folgendes schreiben:
' rp%={WINDOW(win&)+50}
'
IF nr&>0 ! Gadget-Initialisierung
bgadget%(nr&)=AllocMem(50,65537)
IF bgadget%(nr&)=0
@ende
ENDIF
'
WORD{bgadget%(nr&)+4}=x1& ! Gadget-Struktur
WORD{bgadget%(nr&)+6}=y1&
WORD{bgadget%(nr&)+8}=x2&-x1&+1
WORD{bgadget%(nr&)+10}=y2&-y1&+1
WORD{bgadget%(nr&)+14}=1 ! Activision
WORD{bgadget%(nr&)+16}=1 ! Type
WORD{bgadget%(nr&)+38}=nr& ! ID
'
~AddGadget(win%(win&),bgadget%(nr&),-1)
~OnGadget(bgadget%(nr&),win%(win&),0)
ENDIF
'
~SetAPen(rp%,col&)
~RectFill(rp%,x1&,y1&,x2&,y2&)
~SetDrMd(rp1%,0)
~SetDrMd(rp2%,0)
IF art&=1 ! art = 1 normale Darstellung
~SetAPen(rp%,2)
~Move(rp%,x2&,y1&)
~Draw(rp%,x1&,y1&)
~Draw(rp%,x1&,y2&)
~Move(rp%,x1&+1,y1&+1)
~Draw(rp%,x1&+1,y2&)
~SetAPen(rp%,1)
~Draw(rp%,x2&,y2&)
~Draw(rp%,x2&,y1&)
~Move(rp%,x2&-1,y1&+1)
~Draw(rp%,x2&-1,y2&)
ELSE IF art&=2 ! art = 2 inverse Darstellung
~SetAPen(rp%,1)
~Move(rp%,x2&,y1&)
~Draw(rp%,x1&,y1&)
~Draw(rp%,x1&,y2&)
~Move(rp%,x1&+1,y1&+1)
~Draw(rp%,x1&+1,y2&)
~SetAPen(rp%,2)
~Draw(rp%,x2&,y2&)
~Draw(rp%,x2&,y1&)
~Move(rp%,x2&-1,y1&+1)
~Draw(rp%,x2&-1,y2&)
ELSE IF art&=3 ! art = 3: 3D und invertiert
'
' Wow! Rekursive Programmierung in Gfa-Basic...
'
@intgadget(win&,0,x1&,y1&,x2&,y2&,col&,1,"")
@intgadget(win&,0,x1&+1,y1&+1,x2&-1,y2&-1,col&,2,"")
ENDIF
IF a$<>""
a$=a$+CHR$(0)
l&=TextLength(rp%,V:a$,LEN(a$)-1)
x&=((x2&-x1&-l&)/2)+x1&
y&=((y2&-y1&-8)/2)+y1&+7
l&=LEN(a$)-1
~SetAPen(rp%,1)
~Move(rp%,x&+1,y&+1)
~Text(rp%,V:a$,l&)
~SetAPen(rp%,2)
~Move(rp%,x&,y&)
~Text(rp%,V:a$,l&)
ENDIF
RETURN
PROCEDURE killintgadget(win&,i&)
'
' Löscht ein Gadget mit der Nummer "i&", das mit "intgadget" erstellt wurde
'
' win& = Windownummer, i& = Gadgetnummer
'
IF bgadget%(i&)
~RemoveGadget(win%(win&),bgadget%(i&))
~FreeMem(bgadget%(i&),50)
bgadget%(i&)=0
ENDIF
RETURN
[0m[1 p